﻿using System.Collections.Generic;

namespace Algorytm
{
    public class Algorytm_Sala
    {
        public int numer;
        public int ilosc_przedmiotow;
        public List<int> przedmioty;
        private Algorytm_Element_Planu[][] tab;
        public List<Algorytm_Przedzial> zle_przedzialy;

        public Algorytm_Sala() { }

        public Algorytm_Sala(int numer_sali, int liczba_przedmiotow, int[] tablica_przedmiotow, bool czy_studia)
        {
            if (czy_studia)
                tab = Algorytm_Tworzenie_dla_Uczelni.Init_tab();
            else
                tab = Algorytm_Tworzenie_dla_Szkoly.Init_tab();
            numer = numer_sali;
            przedmioty = new List<int>();
            ilosc_przedmiotow = liczba_przedmiotow;
            for (int i = 0; i < tablica_przedmiotow.Length; i++)
            {
                przedmioty.Add(tablica_przedmiotow[i]);
            }
            zle_przedzialy = new List<Algorytm_Przedzial>();
        }

        public bool sprawdz_czy_jest_w_zlym_przedziale(int dzien, int godzina, int dlugosc)
        {
            foreach (var item in zle_przedzialy)
            {
                if (item.Dzien == dzien)
                {
                    if (godzina < item.Koniec && godzina + dlugosc > item.Poczatek) return true;
                }
            }
            return false;
        }

        public void Utworz_elementy_do_planu(int flaga)
        {
            if (flaga == 0)
            {
                tab = Algorytm_Tworzenie_dla_Szkoly.Init_tab();
            }
            else
            {
                tab = Algorytm_Tworzenie_dla_Uczelni.Init_tab();
            }
        }

        public bool Czy_sala_jest_wolna(int dzien, int godzina, int dlugosc, int ilosc_godzin)
        {
            bool czy = true;
            if (godzina + dlugosc > ilosc_godzin) return false;
            for (int i = 0; i < dlugosc; i++)
            {
                if (tab[dzien][godzina + i].Czy_jest() || tab[dzien][godzina + i].czy_sa_fragmentem_zajec) return false;
            }
            return czy;
        }

        public List<Algorytm_Element_Planu> Zwroc_przedmioty_do_zamiany(int dzien)
        {
            List<Algorytm_Element_Planu> lista = new List<Algorytm_Element_Planu>();
            foreach (var item in zle_przedzialy)
            {
                if (item.Dzien != dzien) continue;
                if (tab[dzien][item.Poczatek].czy_sa_fragmentem_zajec)
                {
                    int q = item.Poczatek - 1;
                    while (tab[dzien][q].czy_sa_fragmentem_zajec) q--;
                    tab[dzien][q].Ustaw_dzien_i_godzine(dzien, q);
                    Algorytm_Element_Planu element = new Algorytm_Element_Planu(tab[dzien][q]);

                    lista.Add(element);
                }
                for (int i = item.Poczatek; i < item.Koniec; i++)
                {
                    //Algorytm_Tworzenie_dla_Szkoly.p("wartosci ");
                    if (tab[dzien][i].Czy_jest() && !tab[dzien][i].czy_sa_fragmentem_zajec)
                    {
                        tab[dzien][i].Ustaw_dzien_i_godzine(dzien, i);
                        Algorytm_Element_Planu element = new Algorytm_Element_Planu(tab[dzien][i]);

                        lista.Add(element);
                    }
                }
            }
            return lista;
        }

        public bool Czy_sala_jest_wolna_do_zajecia(int dzien, int godzina, int dlugosc)
        {
            bool czy = true;
            if (godzina + dlugosc > Algorytm_Tworzenie_dla_Uczelni.liczba_godzin_w_dniu) return false;
            if (tab[dzien][godzina].czy_sa_fragmentem_zajec) return false;
            for (int i = 1; i < dlugosc; i++)
            {
                if (tab[dzien][godzina + i].Czy_jest()) return false;
                czy = czy && !tab[dzien][godzina + i].czy_sa_fragmentem_zajec;
            }
            return czy;
        }

        public void Usun_skojarzenie(int dzien, int godzina, int dlugosc)
        {
            Algorytm_Tworzenie_dla_Szkoly.p("uuuu dzien " + dzien + " godzina " + godzina + " dlugosc " + dlugosc);
            for (int i = 0; i < dlugosc; i++)
            {
                tab[dzien][godzina + i].Usun();
            }
        }

        public void Dodaj_skojarzenie(Algorytm_Element_Planu element, int dzien, int godzina, int dlugosc)
        {
            //Algorytm_Tworzenie_dla_Uczelni.p("jestem tutaj z " + dzien + " " + godzina + " " + dlugosc);
            tab[dzien][godzina] = element;
            //Algorytm_Tworzenie_dla_Uczelni.p("dziwne wartosc frag dla dzien " + dzien + " godz " + godzina + " " + tab[dzien][godzina].czy_sa_fragmentem_zajec);
            Algorytm_Element_Planu el = new Algorytm_Element_Planu(element.klasa, element.nauczyciel, element.przedmiot, element.sala, element.dlugosc, element.czy_grupowe);
            for (int i = 1; i < dlugosc; i++)
            {
                tab[dzien][godzina + i] = el;
                tab[dzien][godzina + i].Dodaj_jako_fragment_zajec();
                //Algorytm_Tworzenie_dla_Uczelni.p("ustawiam dla dzien " + dzien + " godzina " + q);
            }
            //Algorytm_Tworzenie_dla_Uczelni.p("dziwne ale po wartosc frag dla dzien " + dzien + " godz " + godzina + " " + tab[dzien][godzina].czy_sa_fragmentem_zajec);
        }

        public void Dodaj_skojarzenie_do_planu_awaryjnego(Algorytm_Element_Planu element, int dzien, int godzina, int dlugosc)
        {
            tab[dzien][godzina] = element;
            Algorytm_Element_Planu el = new Algorytm_Element_Planu(element.klasa, element.nauczyciel, element.przedmiot, element.sala, element.dlugosc, element.czy_grupowe);
            for (int i = 1; i < dlugosc; i++)
            {
                tab[dzien][godzina + i] = el;
                tab[dzien][godzina + i].Dodaj_jako_fragment_zajec();
            }
        }

        public void dodaj_zly_przedzial(Algorytm_Przedzial przedzial)
        {
            zle_przedzialy.Add(przedzial);
        }
    }
}